import Vue from 'vue';
import moment from 'moment';

/**
 * 时间日期格式化全局引入
 * 使用文档：https://momentjs.bootcss.com/
 */
export function $moment() {
	return moment();
}

/**
 * 获取文件后缀名
 */
export function $getFileSuffix(file) {
	return !file ? null : file.substring(file.lastIndexOf(".") + 1);
}

/**
 * 获取对象指定属性
 * object 取值对象源数据
 * arr 需要获取的属性数组
 */
export function $getAssignAttr(object, arr) {
	let obj = {};
	Array.from(arr).forEach(item => {
		obj[item] = object[item];
	})
	return obj;
}

/**
 * 数组转对象
 * arr 需要转换的数组
 * code 转换后对象属性名取值
 * value 转换后对象属性对应数据
 */
export function $arrayToObject(arr, code, value) {
	let obj = {};
	Array.from(arr).forEach(item => {
		obj[item[code || 'code']] = item[value || 'value'];
	})
	return obj;
}

/**
 * 深度复制数据
 * params 需要复制的数据
 */
export function $deepClone(params) {
	return JSON.parse(JSON.stringify(params));
}

/**
 * 去除字符串中的空格
 * str 需要处理的字符串
 * type 去除字符串空格的类型
 */
export function $wipeSpace(str, type) {
	switch (type) {
		case 'all':
			return str.replace(/\s*/g, "");
			break;
		case 'both':
			return str.replace(/^\s|\s$/g, "");
			break;
		case 'innerLeft':
			return str.replace(/^\s*/, "");
			break;
		case 'innerRight':
			return str.replace(/(\s*$)/g, "");
			break;
	}
}

/**
 * 清除html中的行内样式
 * html 需要处理的数据
 */
export function $cleanStyle(html) {
	let newHtml = ''
	let reg = /style\s*?=\s*?([‘"])[\s\S]*?\1/;
	if (html) {
		newHtml = html.replace(reg, '')
	}
	return newHtml
}

/**
 * 树形数据转扁平化数据
 * dataSource 树形源数据
 */
export function $treeToFlat(dataSource) {
	let flatArr = [];
	let dataArr = this.$deepClone(dataSource);
	const flatFunction = arr => {
		Array.from(arr).forEach(item => {
			flatArr.push(item);
			!!item.childList && item.childList.length > 0 ? flatFunction(item.childList) : null;
			delete item.childList;
		})
	}
	flatFunction(dataArr);
	return flatArr;
}

/**
 * 扁平数据转树形数据
 * dataSource 扁平化源数据
 * parentId 树形数据顶级ID
 */
export function $flatToTree(dataSource, parentId) {
	let dataArr = this.$deepClone(dataSource);
	let treeList = dataArr.reduce((prev, cur) => {
		prev[cur["id"]] = cur;
		return prev;
	}, {});
	let result = dataArr.reduce((prev, cur) => {
		let pid = cur[parentId];
		let parent = treeList[pid];
		if (parent) {
			parent.children ? parent.children.push(cur) : (parent.children = [cur]);
		} else if (pid == 0) {
			prev.push(cur);
		}
		return prev;
	}, []);
	return result;
}

/**
 * 判断是否为对象
 * obj 传入的对象
 */
export function $isPlainObject(obj) {
	return typeof obj === 'object' && Object.prototype.toString.call(obj) === '[object Object]';
}

/**
 * 判断对象是否相等
 * aObj/bObj 为需要对比的两个对象
 */
export function $isEqualObject(aObj, bObj) {
	if (!this.$isPlainObject(aObj) || !this.$isPlainObject(bObj)) {
		return aObj === bObj
	}
	if (Object.keys(aObj).length !== Object.keys(bObj).length) {
		return false
	}
	for (let key in aObj) {
		if (this.$isPlainObject(aObj[key]) && this.$isPlainObject(bObj[key])) {
			if (!this.$isEqualObject(aObj[key], bObj[key])) {
				return false;
			}
		} else if (aObj[key] !== bObj[key]) {
			return false;
		}
	}
	return true;
}

/**
 * 判断数组是否相等
 * aArr/bArr 为需要对比的两个数组
 */
export function $isEqualArray(aArr, bArr) {
	if (!Array.isArray(aArr) || !Array.isArray(bArr)) return false;
	if (aArr.length !== bArr.length) return false;
	for (let i = 0; i < aArr.length; i++) {
		if (this.$isPlainObject(aArr[i]) && this.$isPlainObject(bArr[i])) {
			if (!this.$isEqualObject(aArr[i], bArr[i])) {
				return false;
			}
		} else if (aArr[i] !== bArr[i]) {
			return false;
		}
	}
	return true;
}

/**
 * 判断对象是否是嵌套对象
 * obj 需要判断的对象
 */
export function $isNestedObject(obj) {
	if (!this.$isPlainObject(obj)) return false;
	for (let key in obj) {
		if (obj[key] instanceof Object) {
			if (obj[key] instanceof Array && obj[key].length > 0) {
				return true;
			} else if (this.$isPlainObject(obj[key])) {
				return true;
			}
		}
	}
	return false;
}

/**
 * 请求参数JSON转query
 * params 传入的JSON参数
 */
export function $objectToQuery(params) {
	let argArr = Object.entries(!params ? {} : params);
	return argArr.reduce((cur, arr, index) => {
		let symbol = cur.length === 0 ? '?' : '&';
		switch (typeof arr[1]) {
			case 'number':
				cur += isNaN(arr[1]) ? '' : `${symbol}${arr[0]}=${arr[1]}`;
				break;
			case 'string':
				cur += `${symbol}${arr[0]}=${arr[1]}`;
				break;
			case 'boolean':
				cur += `${symbol}${arr[0]}=${arr[1]}`;
				break;
		}
		return cur;
	}, '');
}

/**
 * 全屏加载动画
 */
export function $fullLoading() {
	const loading = this.$loading({
		lock: true,
		text: "正在加载...",
		spinner: "el-icon-loading",
		background: "rgba(0, 0, 0, 0.6)",
		customClass: 'custom_full_loading'
	});
}

/**
 * 文件下载
 */


/**
 * 导出Excel文件
 */
/* export function $exportExcelFile(option) {
	return new Promise((resolve, reject) => {
		let opt = option || {};
		let xhr = new XMLHttpRequest();
		// FileSaver.saveAs(opt.url, '1680604017698_4062.png');
		xhr.open("get", opt.url, true);
		// xhr.responseType = "blob";
		xhr.onload = () => {
			if (xhr.status == 200) {
				console.log(xhr.response);
			}
		};
		xhr.send();
	})
} */

/**
 * 下载系统附件 - blob方式
 */
export function $downloadAttachForBlob(blob, filename) {
	let link = document.createElement('a');
	let url = window.URL.createObjectURL(blob);
	link.style.display = 'none';
	link.href = url;
	link.setAttribute('download', filename);
	document.body.appendChild(link);
	link.click();
	setTimeout(() => {
		document.body.removeChild(link);
	}, 2500);
}